#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
定时执行脚本程序
每隔3分钟执行一次p21_user_portrait.py
"""

import subprocess
import time
import logging
from datetime import datetime
import os
import sys

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler("scheduler_3min.log"),  # 单独的日志文件
        logging.StreamHandler()
    ]
)

def run_script(script_path):
    """运行指定的Python脚本"""
    try:
        logging.info(f"开始执行脚本: {script_path}")
        
        # 使用当前Python解释器执行脚本
        result = subprocess.run(
            [sys.executable, script_path],
            capture_output=True,
            text=True,
            timeout=180,  # 3分钟超时（根据实际脚本运行时间调整）
            cwd=os.path.dirname(script_path)  # 在脚本所在目录运行
        )
        
        # 记录标准输出和错误输出
        if result.stdout:
            logging.info(f"{os.path.basename(script_path)} 输出: {result.stdout}")
        if result.stderr:
            logging.error(f"{os.path.basename(script_path)} 错误: {result.stderr}")
        
        if result.returncode == 0:
            logging.info(f"脚本执行成功: {script_path}")
            return True
        else:
            logging.error(f"脚本执行失败，返回码: {result.returncode}")
            return False
            
    except subprocess.TimeoutExpired:
        logging.error(f"脚本执行超时: {script_path}")
        return False
    except Exception as e:
        logging.error(f"执行脚本时发生异常: {e}")
        return False

def main():
    # 获取当前脚本所在目录
    current_dir = os.path.dirname(os.path.abspath(__file__))
    
    # 构建脚本完整路径
    p21_script = os.path.join(current_dir, "p21_user_portrait.py")
    
    # 检查脚本文件是否存在
    if not os.path.exists(p21_script):
        logging.error(f"找不到脚本文件: {p21_script}")
        return
    
    logging.info("开始定时任务调度（每3分钟执行一次）...")
    
    while True:
        try:
            # 执行p21脚本
            run_script(p21_script)
            
            # 等待3分钟（180秒）
            next_run = datetime.now().timestamp() + 180
            logging.info(f"下一次执行时间: {datetime.fromtimestamp(next_run).strftime('%Y-%m-%d %H:%M:%S')}")
            time.sleep(180)
            
        except KeyboardInterrupt:
            logging.info("程序被用户中断")
            break
        except Exception as e:
            logging.error(f"程序执行过程中发生异常: {e}")
            # 发生异常后等待30秒再继续，避免频繁错误
            time.sleep(30)

if __name__ == "__main__":
    main()